//
// Created by Joy on 2024/7/23.
//

#include "iostream"
#define MAXSIZE 64
using namespace std;
typedef struct{
    int data[MAXSIZE];
    int front;
    int rear;
}Queue;
void InitQueue(Queue *q){
    q->front = 0;
    q->rear = 0;
}
bool IsEmpty(Queue q){
    if (q.rear==q.front){
        return true;
    }
}
bool IsFull(Queue q){
    if ((q.rear+1)%MAXSIZE == 0){ // +1是因为数组从0开始的
        return true;
    }
    return false;
}
//入栈
bool EnQueue(Queue *q,int value){
    if (IsFull(*q)){
        return false;
    }
    q->data[q->rear] = value;
    //q-rear指向下一个地址：如果是rear+1，不能防止假溢出（front队首有出队的，而切rear已经执行用光了列队长度），此时让rear指向队首[0]
    q->rear = (q->rear + 1) % MAXSIZE; //如果没有假溢出，rear依然按照队列顺序存储，出现假溢出，rear指向队首[0]
    return true;
}
//出队
bool DeQueue(Queue *q,int* value){
    if (IsEmpty(*q)){
        return false;
    }
    *value = q->data[q->front];
    q->front = (q->front +1) % MAXSIZE;  // front不光要按着列队顺序指，还要指向出现假溢出插入的数据地址
    return true;
}
bool printQueue(Queue q){
    if (IsEmpty(q)){
        return false;
    } else{
        cout << "当前队列为：\n";
        Queue f = q;
        while (q.rear != f.front){
            cout << q.data[f.front] <<"\t";
            f.front = (f.front + 1) % MAXSIZE;
        }
        cout<<"\n-----遍历完成-----";
    }


}
int main() {
    Queue queue;
    InitQueue(&queue);
    for (int i = 0; i < 10; ++i) {
        EnQueue(&queue,i);
    }
    printQueue(queue);
    return 0;
}
